+2004-12-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-4:
+
+ Fix #159656:
+
+ * gtk/gtkfilechooserdefault.c (PendingOp): New enumeration for the
+ pending operation to perform when finishing loading a folder.
+ (struct _GtkFileChooserDefault): New fields 'pending_op' and
+ 'pending_select_path'.
+ (pending_op_queue): New utility function.
+ (pending_op_process): New utility function.
+ (gtk_file_chooser_default_select_path): Don't select the path
+ immediately; delay it until the folder is finished loading.
+ (browse_files_model_finished_loading_cb): Process the pending
+ operation.
+ (browse_files_select_first_row): New utility function.
+ (gtk_file_chooser_default_initial_focus): Use
+ browse_files_select_first_row().
+ (gtk_file_chooser_default_should_respond): Queue an operation to
+ select the first row once we load the child folder.
+ (up_folder_handler): Queue an operation to select the current
+ folder once we load the parent folder.
+ (gtk_file_chooser_default_finalize): Free the pending_select_path.
+
Thu Dec 2 13:18:34 2004 Manish Singh <yosh@gimp.org>
* gdk/x11/gdkgc-x11.c (make_fg_tile_picture): Make sure we always
+2004-12-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-4:
+
+ Fix #159656:
+
+ * gtk/gtkfilechooserdefault.c (PendingOp): New enumeration for the
+ pending operation to perform when finishing loading a folder.
+ (struct _GtkFileChooserDefault): New fields 'pending_op' and
+ 'pending_select_path'.
+ (pending_op_queue): New utility function.
+ (pending_op_process): New utility function.
+ (gtk_file_chooser_default_select_path): Don't select the path
+ immediately; delay it until the folder is finished loading.
+ (browse_files_model_finished_loading_cb): Process the pending
+ operation.
+ (browse_files_select_first_row): New utility function.
+ (gtk_file_chooser_default_initial_focus): Use
+ browse_files_select_first_row().
+ (gtk_file_chooser_default_should_respond): Queue an operation to
+ select the first row once we load the child folder.
+ (up_folder_handler): Queue an operation to select the current
+ folder once we load the parent folder.
+ (gtk_file_chooser_default_finalize): Free the pending_select_path.
+
Thu Dec 2 13:18:34 2004 Manish Singh <yosh@gimp.org>
* gdk/x11/gdkgc-x11.c (make_fg_tile_picture): Make sure we always
+2004-12-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-4:
+
+ Fix #159656:
+
+ * gtk/gtkfilechooserdefault.c (PendingOp): New enumeration for the
+ pending operation to perform when finishing loading a folder.
+ (struct _GtkFileChooserDefault): New fields 'pending_op' and
+ 'pending_select_path'.
+ (pending_op_queue): New utility function.
+ (pending_op_process): New utility function.
+ (gtk_file_chooser_default_select_path): Don't select the path
+ immediately; delay it until the folder is finished loading.
+ (browse_files_model_finished_loading_cb): Process the pending
+ operation.
+ (browse_files_select_first_row): New utility function.
+ (gtk_file_chooser_default_initial_focus): Use
+ browse_files_select_first_row().
+ (gtk_file_chooser_default_should_respond): Queue an operation to
+ select the first row once we load the child folder.
+ (up_folder_handler): Queue an operation to select the current
+ folder once we load the parent folder.
+ (gtk_file_chooser_default_finalize): Free the pending_select_path.
+
Thu Dec 2 13:18:34 2004 Manish Singh <yosh@gimp.org>
* gdk/x11/gdkgc-x11.c (make_fg_tile_picture): Make sure we always
+2004-12-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-4:
+
+ Fix #159656:
+
+ * gtk/gtkfilechooserdefault.c (PendingOp): New enumeration for the
+ pending operation to perform when finishing loading a folder.
+ (struct _GtkFileChooserDefault): New fields 'pending_op' and
+ 'pending_select_path'.
+ (pending_op_queue): New utility function.
+ (pending_op_process): New utility function.
+ (gtk_file_chooser_default_select_path): Don't select the path
+ immediately; delay it until the folder is finished loading.
+ (browse_files_model_finished_loading_cb): Process the pending
+ operation.
+ (browse_files_select_first_row): New utility function.
+ (gtk_file_chooser_default_initial_focus): Use
+ browse_files_select_first_row().
+ (gtk_file_chooser_default_should_respond): Queue an operation to
+ select the first row once we load the child folder.
+ (up_folder_handler): Queue an operation to select the current
+ folder once we load the parent folder.
+ (gtk_file_chooser_default_finalize): Free the pending_select_path.
+
Thu Dec 2 13:18:34 2004 Manish Singh <yosh@gimp.org>
* gdk/x11/gdkgc-x11.c (make_fg_tile_picture): Make sure we always
GtkVBoxClass parent_class;
};
+typedef enum {
+ PENDING_OP_NONE,
+ PENDING_OP_SELECT_PATH,
+ PENDING_OP_SELECT_FIRST
+} PendingOp;
+
struct _GtkFileChooserDefault
{
GtkVBox parent_instance;
LoadState load_state;
guint load_timeout_id;
+ PendingOp pending_op;
+ GtkFilePath *pending_select_path;
+
GtkFileFilter *current_filter;
GSList *filters;
GtkTreeViewColumn *column,
GtkFileChooserDefault *impl);
+static void select_func (GtkFileSystemModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer user_data);
+
static void path_bar_clicked (GtkPathBar *path_bar,
GtkFilePath *file_path,
gboolean child_is_hidden,
impl->show_hidden = FALSE;
impl->icon_size = FALLBACK_ICON_SIZE;
impl->load_state = LOAD_FINISHED;
+ impl->pending_op = PENDING_OP_NONE;
+ impl->pending_select_path = NULL;
gtk_widget_set_redraw_on_allocate (GTK_WIDGET (impl), TRUE);
gtk_box_set_spacing (GTK_BOX (impl), 12);
if (impl->preview_path)
gtk_file_path_free (impl->preview_path);
+ if (impl->pending_op == PENDING_OP_SELECT_PATH)
+ {
+ g_assert (impl->pending_select_path != NULL);
+ gtk_file_path_free (impl->pending_select_path);
+ }
+
load_remove_timer (impl);
/* Free all the Models we have */
g_assert (impl->load_state == LOAD_FINISHED);
}
+/* Queues a pending operation relative to selecting a file when the current
+ * folder finishes loading.
+ */
+static void
+pending_op_queue (GtkFileChooserDefault *impl, PendingOp op, const GtkFilePath *path)
+{
+ if (impl->pending_op == PENDING_OP_SELECT_PATH)
+ {
+ g_assert (impl->pending_select_path != NULL);
+ gtk_file_path_free (impl->pending_select_path);
+
+ impl->pending_select_path = NULL;
+ }
+
+ impl->pending_op = op;
+
+ if (impl->pending_op == PENDING_OP_SELECT_PATH)
+ {
+ g_assert (path != NULL);
+ impl->pending_select_path = gtk_file_path_copy (path);
+ }
+}
+
+/* Selects the first row in the file list */
+static void
+browse_files_select_first_row (GtkFileChooserDefault *impl)
+{
+ GtkTreePath *path;
+
+ path = gtk_tree_path_new_from_indices (0, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (impl->browse_files_tree_view), path, NULL, FALSE);
+ gtk_tree_path_free (path);
+}
+
+/* Processes the pending operation when a folder is finished loading */
+static void
+pending_op_process (GtkFileChooserDefault *impl)
+{
+ switch (impl->pending_op)
+ {
+ case PENDING_OP_NONE:
+ break;
+
+ case PENDING_OP_SELECT_PATH:
+ g_assert (impl->pending_select_path != NULL);
+
+ _gtk_file_system_model_path_do (impl->browse_files_model, impl->pending_select_path, select_func, impl);
+ gtk_file_path_free (impl->pending_select_path);
+ impl->pending_select_path = NULL;
+ impl->pending_op = PENDING_OP_NONE;
+ break;
+
+ case PENDING_OP_SELECT_FIRST:
+ browse_files_select_first_row (impl);
+ impl->pending_op = PENDING_OP_NONE;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ g_assert (impl->pending_op == PENDING_OP_NONE);
+ g_assert (impl->pending_select_path == NULL);
+}
+
/* Callback used when the file system model finishes loading */
static void
browse_files_model_finished_loading_cb (GtkFileSystemModel *model,
else
g_assert (impl->load_state == LOAD_FINISHED);
+ pending_op_process (impl);
set_busy_cursor (impl, FALSE);
}
if (is_hidden)
g_object_set (impl, "show-hidden", TRUE, NULL);
- result = _gtk_file_system_model_path_do (impl->browse_files_model, path,
- select_func, impl);
- if (!result)
- g_set_error (error,
- GTK_FILE_CHOOSER_ERROR,
- GTK_FILE_CHOOSER_ERROR_NONEXISTENT,
- _("Could not find the path"));
-
- return result;
+ pending_op_queue (impl, PENDING_OP_SELECT_PATH, path);
+ return TRUE;
}
g_assert_not_reached ();
if (num_selected == 1 && all_folders)
{
switch_to_selected_folder (impl);
+ pending_op_queue (impl, PENDING_OP_SELECT_FIRST, NULL);
return FALSE;
}
else
|| impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
{
if (impl->load_state == LOAD_FINISHED)
- {
- GtkTreePath *path;
-
- path = gtk_tree_path_new_from_indices (0, -1);
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (impl->browse_files_tree_view), path, NULL, FALSE);
- gtk_tree_path_free (path);
- }
+ browse_files_select_first_row (impl);
widget = impl->browse_files_tree_view;
}
static void
up_folder_handler (GtkFileChooserDefault *impl)
{
+ pending_op_queue (impl, PENDING_OP_SELECT_PATH, impl->current_folder);
_gtk_path_bar_up (GTK_PATH_BAR (impl->browse_path_bar));
}